package api

import (
	"GopherFocus/app/model"
	"GopherFocus/app/system/index/internal/define"
	"GopherFocus/app/system/index/internal/service"
	"GopherFocus/library/response"
	"github.com/gogf/gf/net/ghttp"
)

var Register = registerApi{}

type registerApi struct{}

func (a *registerApi) Index(r *ghttp.Request) {
	service.View.Render(r, model.View{})
}

func (a *registerApi) Do(r *ghttp.Request) {
	var (
		req *define.UserRegisterReq
	)
	// r.Parse接收*struct/**struct/*[]struct/*[]*struct类型，如果为指针未分配内存，则在Parse方法内会为该指针分配内存，将请求参数值
	// 转换为结构体属性值，并对结构体中包含v标签的字段进行校验
	//
	// r.Parse()内部运行逻辑：首先判断传入参数的类型，如果不是一个指针类型则直接返回错误信息；
	// （例如整型指针所指向的就是一个整型，Elem()）,如果结果为结构体类型或指针类型（说明传入的是一个双重指针）
	// 保存前端参数的key value值接下来利用反射获取到该指针所指向的变量的类型的是一个名为data的变量，获取结构体的所有字段名，
	// 如果字段在data中没有找到匹配的key，则在data中添加字段名到该字段类型默认值的映射
	// 之后会通过gconv.Struct(data, pointer)将data中的值转换为pointer所执行结构体的字段值
	if err := r.Parse(&req); err != nil {
		response.JsonExit(r, 1, err.Error())
	}
	if !service.Captcha.VerifyAndClear(r, model.CaptchaStoreKey, req.Captcha) {
		response.JsonExit(r, 1, "请输入正确的验证码")
	}
	if err := service.User.Register(r.Context(), req.UserRegisterInput); err != nil {
		response.JsonExit(r, 1, err.Error())
	} else {
		// 自动登录
		err := service.User.Login(r.Context(), define.UserLoginInput{
			Passport: req.Passport,
			Password: req.Password,
		})
		if err != nil {
			response.JsonExit(r, 1, err.Error())
		}
		response.JsonExit(r, 0, "")
	}
}
